//通用的发布订阅模式
var event = {
    //消息列表
    clientList : {},
    //订阅
    listen : function( key, fn ){
        if(!this.clientList[ key ]){
            this.clientList[ key ] = []
        }
        this.clientList[ key ].push( fn )
    },
    //发布消息
    trigger : function(){
        var key = [].shift.call(arguments)
        if(!this.clientList[key] || this.clientList.length===0)
            return false
        for(let i=0;i<this.clientList[key].length;i++){
            this.clientList[key][i](arguments)
        }
    }
}
//给对象安装发布订阅模式
var installEvent = function( obj ){
    for(var i in event){
        obj[i]=event[i]
    }
}

//取消订阅事件
event.remove = function ( key, fn){
    var fns = this.clientList[key]
    if(!fns){
        return false;
    }
    //没有传入具体的fn，表示取消整个消息队列
    if(!fn){
        fns&&(fns.length=0)
    }else{
        for(var l = fns.length;l>0;l--){
            if(fns[l]===fn){
                fns.splice(l,1) //删除订阅者的回调
            }
        }
    }
}